home *** CD-ROM | disk | FTP | other *** search
- { Keywords: DC.PAS CAD GRAPHICS REIFF IBM-PC PC-DOS TURBO VERSION 3
-
- This is a poor man's CAD starter system. It is experimental and has not
- been thoroughly tested. It is set-up to draw simple electrical circuits,
- but can be modified for architectural, mechanical or other symbols. You
- will find that the program still contains bracketed debugging lines and
- future possibility lines.
-
- It requires an IBM-PC or Compatable, Turbo Version 3 and Graphics Monitor.
- It is a derivative of a course on interactive computer graphics which I
- have taught. It includes several elements of the CORE Graphics Standard.
-
- A companion program module which will print that which is shown on the
- screen on an Epsom with GRAFTRAX will be written and made available as
- User Supported Software.
-
- The program should compile and run as you receive it.
-
- I would appreciate your questions, comments, criticisms or suggestions.
- Glenn Reiff 59 Villa Drive Pueblo, CO 81001
- }
-
- (****************************************************************************)
- (* DC.PAS To Draw and Print Electrical Circuits 5/12/85 *)
- (****************************************************************************)
- const WidthStart = 0; HeightStart = 0;
- WidthEnd = 231; HeightEnd = 171;
- DFSize = 1000;
-
- type Files = record
- dfOP,dfX,dfY,
- dfA,dfX0,dfY0,dfC,dfM: integer;
- end;
- Displays = array[1..DFSize] of Files;
- Str40 = string[40];
- CharSet = set of char;
-
- var Frame : array[WidthStart..WidthEnd,HeightStart..HeightEnd] of boolean;
- DisplayFile: Displays;
- Free: integer;
- EraseFlag: boolean;
- A,X0,Y0,C,M,
- Width,Height,
- Xwas,Ywas,Xnow,Ynow,
- Color, Mode : integer;
- Character,Ch,Direction : char;
-
- procedure Graphics; external 'GRAPH.BIN';
- procedure Palette(N: Integer); external Graphics[12];
- procedure GraphWindow(X1,Y1,X2,Y2: Integer); external Graphics[18];
- procedure Plot(X,Y,Color: Integer); external Graphics[21];
- procedure FillScreen(Color: Integer); external Graphics[45];
- procedure ClearScreen; external Graphics[60];
-
- procedure BEEP;
- BEGIN write(chr(7)); END;
-
- procedure CHOOSE( L: integer;
- Prompt: Str40;
- Term: CharSet;
- var TC: Char );
- var Ch: char;
- I: integer;
- BEGIN
- if L=0 then gotoXY(1,25) else gotoXY(1,L);
- for I:=1 to length(Prompt) do begin
- if (I>3) then
- if (copy(Prompt,I-2,1)=' ') and (copy(Prompt,I-1,1)=' ') then
- highvideo else lowvideo;
- write(copy(Prompt,I,1));
- end;
- repeat
- read(kbd,Ch); TC:=upcase(Ch); if not (TC in Term) then BEEP;
- until TC in Term;
- write(Ch); if L=0 then gotoXY(1,25) else gotoXY(1,L);
- write(' ');
- END; { CHOOSE }
-
- function MIN(A,B: real): real;
- BEGIN if A>B then MIN:=B else MIN:=A; END;
-
- function MAX(A,B: real): real;
- BEGIN if A>B then MAX:=A else MAX:=B; END;
-
- procedure DDA (X1, Y1, X2, Y2, Color, Mode: integer);
- var
- dX, dY, dXstep, dYstep, X, Y : real;
- Steps, S : integer;
- BEGIN
- dX:= X2 - X1; dY:= Y2 - Y1;
- if abs(dX) > WidthEnd then dX:=WidthEnd;
- if abs(dY) > HeightEnd then dY:=HeightEnd;
- Steps:=trunc(MAX(abs(dX),abs(dY)))+1;
- dXstep:= dX / Steps; dYstep:= dY / Steps;
- X:= X1 + 0.5; Y:= Y1 + 0.5;
- for S:= 1 to Steps do
- begin
- if Mode<0 then
- begin
- PLOT(trunc(X),trunc(Y),Color);
- end
- else
- if Mode=0 then
- begin
- PLOT(trunc(X),trunc(Y),Color);
- Frame[trunc(X),trunc(Y)]:= true;
- end;
- X:= X + dXstep; Y:= Y + dYstep;
- end; { for S }
- if Mode<0 then
- begin
- PLOT(trunc(X),trunc(Y),Color);
- end
- else
- if Mode=0 then
- begin
- PLOT(trunc(X),trunc(Y),Color);
- Frame[trunc(X),trunc(Y)]:= true;
- end;
- END; { DDA }
-
- procedure ARCDDA (X0, Y0, A, X, Y, Color, Mode: integer); { X0,Y0 Center of Curvature }
- const Roundoff = 0.5; { A Arc Angle, Degrees }
- var { X,Y Starting Point }
- Xarc,Yarc,Arad,Adrawn,Da,B,C : real; { Draws Clockwise }
- BEGIN
- if abs(X-X0) + abs(Y-Y0) >= Roundoff then
- begin
- Arad:=Pi*A/180; Adrawn:=0; B:=0.1; C:=1/(3.2*(abs(X-X0) + abs(Y-Y0)));
- Da:=MIN(B,C); Xarc:=X; Yarc:=Y;
- while Adrawn < Arad do
- begin
- Xarc:=Xarc + (Y0-Yarc) * Da;
- Yarc:=Yarc + (Xarc-X0)*Da;
- Adrawn:=Adrawn + Da;
- PLOT(round(Xarc),round(Yarc),Color);
- Frame[round(Xarc),round(Yarc)]:= true;
- end; { while }
- end; { if abs }
- END; { ARCDDA }
-
- procedure DISPLAY(Xo,Yo: integer); { Xo,Yo are Offsets to Center }
- var X,Y: integer;
- BEGIN
- for Y:= HeightStart to HeightEnd do begin
- for X := WidthStart to WidthEnd do
- if Frame[X,Y]=true then PLOT(Xo+X,Yo+Y,3);
- end; { for Y }
- END; { DISPLAY }
-
- procedure ERASE;
- var X,Y: integer;
- BEGIN
- Free:=1;
- for Y:= HeightStart to HeightEnd do begin
- for X:= WidthStart to WidthEnd do begin
- if Frame[X,Y]<>false then begin
- PLOT(X,Y,0); Frame[X,Y]:=false; end;
- end; { for X }
- end; { for Y }
- for X:=1 to DFSize do with DisplayFile[X] do
- begin
- dfOP:=0; dfX:=0; dfY:=0;
- dfA :=0; dfX0:=0; dfY0:=0; dfC:=0; dfM:=0;
- end;
- END; { ERASE }
-
- procedure INITIALIZE;
- var I: integer;
- BEGIN
- clrscr;
- Height:= HeightEnd - HeightStart; Width:= WidthEnd - WidthStart;
- ERASE;
- END; { INITIALIZE }
-
- function TERMINATE: char;
- BEGIN
- CHOOSE(0,' Continue Quit ',['C','Q'],Ch);
- TERMINATE := upcase(Ch);
- END; { TERMINATE }
-
- procedure ERROR(S: Str40);
- BEGIN
- gotoXY(1,24); BEEP; write(S); delay(3000); gotoXY(1,24); clreol;
- Ch := TERMINATE;
- END; { ERROR }
-
- procedure PUT_POINT(OP,X,Y,A,X0,Y0,Color,Mode: integer);
- BEGIN
- if Free > DFSize then ERROR('DISPLAY FILE FULL');
- with DisplayFile[Free] do
- begin dfOP:=OP; dfX:=X; dfY:=Y;
- dfA:=A; dfX0:=X0; dfY0:=Y0; dfC:=Color; dfM:=Mode;
- end;
- Free:=Free+1;
- END; { PUT_POINT }
-
- procedure GET_POINT(Nth: integer; var OP,X,Y,A,X0,Y0,C,M: integer);
- BEGIN
- with DisplayFile[Nth] do
- begin OP:=DfOP; X:=DfX; Y:=DfY;
- A:=dfA; X0:=dfX0; Y0:=dfY0; Color:=dfC; Mode:=dfM;
- end;
- END; { GET_POINT }
-
- procedure DISPLAY_FILE_ENTER(OP: integer);
- BEGIN
- PUT_POINT(OP,Xnow,Ynow,A,X0,Y0,C,M);
- END; { DISPLAY_FILE_ENTER }
-
- procedure MOVE_ABS(X,Y: integer);
- BEGIN
- Xnow:=X; Ynow:=Y; DISPLAY_FILE_ENTER(1);
- Xwas:=Xnow; Ywas:=Ynow;
- END; { MOVE_ABS }
-
- procedure LINE_ABS(X,Y: integer);
- BEGIN
- Xnow:=X; Ynow:=Y; DISPLAY_FILE_ENTER(2)
- END; { LINE_ABS }
-
- procedure DOMOVE(X,Y: integer);
- BEGIN
- Xwas:=X; Ywas:=Y;
- END; { DOMOVE }
-
- procedure DOLINE(X,Y: integer);
- var X1,Y1: integer;
- BEGIN
- X1:=Xwas; Y1:=Ywas;
- Xwas:=X; Ywas:=Y;
- DDA(X1,Y1,Xwas,Ywas,Color,0);
- END; { DOLINE }
-
- procedure INTERPRET(Start,Count: integer);
- var OP,X,Y: integer;
- Nth: integer;
- BEGIN
- For Nth:=Start to Start+Count-1 do begin
- GET_POINT(Nth,OP,X,Y,A,X0,Y0,Color,Mode);
- (*
- writeln('Nth=',Nth:2,' OP=',OP:2,' X=',X:3,' Y=',Y:3,' C=',Color:2,' M=',Mode:2);
- *)
- if OP=1 then DOMOVE(X,Y)
- else if OP=2 then DOLINE(X,Y)
- else if OP=3 then ARCDDA(X0,Y0,A,X,Y,Color,Mode)
- else ERROR('OP-CODE ERROR');
- end; { For Nth }
- Xnow:=X; Xwas:=X; Ynow:=Y; Ywas:=Y;
- END; { INTERPRET }
-
- procedure MAKE_PICTURE_CURRENT(Xo,Yo: integer);
- BEGIN
- (*
- GOTOXY(1,10); WRITELN('Free=',Free,' ********');
- *)
- if Free>1 then INTERPRET(1,Free-1);
- DISPLAY(Xo,Yo);
- END; { MAKE_PICTURE_CURRENT }
-
-
- function INPUT_TEXT(What: Str40; L: integer): Str40;
- const Shade: char = '0';
- var Input: Str40;
- I: integer;
- BEGIN
- repeat
- gotoXY(1,24); write(What,'? '); for I:=1 to L do write(Shade);
- gotoXY(whereX-L,whereY); read(Input);
- gotoXY(1,24); write(' ');
- if length(Input)>L then Beep;
- until length(Input) <= L;
- INPUT_TEXT:=Input;
- END; { INPUT_TEXT }
-
- procedure PUT_DISK;
- var FilT: text;
- FilName: Str40;
- I: integer;
- BEGIN
- FilName:=INPUT_TEXT('File Name',12);
- assign(FilT,FilName);
- rewrite(FilT);
- writeln(FilT,Free);
- for I:=1 to Free-1 do with DisplayFile[I] do
- writeln(FilT,dfOP:9,dfX:9,dfY:9,dfA:9,dfX0:9,dfY0:9,dfC:9,dfM:9);
- close(FilT);
- END; { PUT_DISK }
-
- procedure GET_DISK;
- var FilT: text;
- FilName: string[12];
- OP,X,Y: real;
- I: integer;
- OK: boolean;
- label Start;
- BEGIN
- Start: FilName:=INPUT_TEXT('File Name',12); OK:=false;
- repeat
- assign(FilT,FilName); {$I-} reset(FilT) {$I+}; OK:=(ioresult=0);
- if not OK then begin
- gotoXY(1,24); write('Can''t find that FILE NAME ! !'); BEEP; delay(2000);
- gotoXY(1,24); clreol; goto Start; end;
- until OK; OK:=false;
- readln(FilT,Free);
- for I:=1 to Free-1 do with DisplayFile[I] do
- readln(FilT,dfOP,dfX,dfY,dfA,dfX0,dfY0,dfC,dfM);
- close(FilT);
- Color:=2; MAKE_PICTURE_CURRENT(0,0);
- END; { GET_DISK }
-
-
- procedure DO_DRAW;
- const M: array[1..19] of string[9] =
- ('Move','Line','Xline','Text','','Battery','Sources','','Resistors','Capacitor',
- 'Inductors','','','','rUn','Put Disk','Get Disk','Erase','Quit');
- var I,J,P: integer;
-
- Procedure PLUS(X,Y,Color,Mode: integer);
- var X1,Y1,X2,Y2: integer;
- BEGIN
- X1:=X-2; X2:=X+2; Y1:=Y-2; Y2:=Y+2;
- DDA(X1,Y,X2,Y,Color,Mode);
- if Mode>=0 then begin MOVE_ABS(X1,Y); LINE_ABS(X2,Y); end;
- DDA(X,Y1,X,Y2,Color,Mode);
- if Mode>=0 then begin MOVE_ABS(X,Y1); LINE_ABS(X,Y2); end;
- END; { PLUS }
-
- Procedure MINUS(X,Y,Color,Mode: integer);
- var X1,Y1,X2,Y2: integer;
- BEGIN
- X1:=X-2; X2:=X+2;
- DDA(X1,Y,X2,Y,Color,Mode);
- if Mode>=0 then begin MOVE_ABS(X1,Y); LINE_ABS(X2,Y); end;
- END; { MINUS }
-
- Procedure AWAIT_STROKE;
- var InKey: Char;
- FuncFlag: Boolean; { Indicates function key }
-
- Procedure INITIALIZE_DRAW;
- BEGIN
- Graphics;
- ClearScreen;
- palette(3);
- gotoXY(71,1);
- write(chr(27),chr(0),chr(24),chr(0),chr(25),chr(0),chr(26)); lowvideo;
- for I:=1 to 19 do begin
- gotoXY(71,I+2);
- if (I=12) or (I=15) then P:=2 else P:=1;
- for J:=1 to length(M[I]) do begin
- if J=P then highvideo else lowvideo;
- write(copy(M[I],J,1));
- end; { for J }
- writeln;
- end; { for I }
- graphwindow(0,0,Width,Height);
- fillscreen(1);
- Color:=2; Mode:=-1;
- PLUS(58,27,Color,-1); PLUS(116,27,Color,-1); PLUS(174,27,Color,-1);
- PLUS(58,85,Color,-1); PLUS(116,85,Color,-1); PLUS(174,85,Color,-1);
- PLUS(58,143,Color,-1); PLUS(116,143,Color,-1); PLUS(174,143,Color,-1);
- Xnow:=58; Xwas:=Xnow; Ynow:=27; Ywas:=Ynow;
- plot(Xnow,Ynow,2); MOVE_ABS(Xnow,Ynow);
- END; { INITIALIZE_DRAW }
-
- Function GET_KEY(var FuncFlag: Boolean): char;
- var ch: char;
- begin
- read(kbd,Ch);
- If (Ch = #27) AND KeyPressed Then { it must be a function key }
- begin
- read(kbd,Ch);
- FuncFlag := true;
- end
- else FuncFlag := false;
- GET_KEY := Ch;
- END; { GET_KEY }
-
- Procedure ALPHANUMERIC;
- var Input: Str40;
- BEGIN
- Input:=INPUT_TEXT('What',12);
- gotoXY(round(0.5+Xnow/8),round(0.5+Ynow/8)); write(Input);
- (*
- Xnow:=Xnow+8*length(Input); Xwas:=Xnow; Ywas:=Ynow; plot(Xwas,Ywas,2);
- MOVE_ABS(Xnow,Ynow); plot(Xwas,Ywas,2);
- for I:=1 to length(Input) do
- begin
- DISPLAY_FILE_ENTER(ord(copy(Input,I,1)));
- Xnow:=Xnow+8;
- end;
- *)
- END; { ALPHANUMERIC }
-
- procedure BATTERY;
- var X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5,X6,Y6,Xhold,Yhold: integer;
- BEGIN
- Color:=0; Xhold:=Xnow; Yhold:=Ynow;
- if (Direction='D') or (Direction='U') then
- begin
- CHOOSE(23,' +Up -Up ',['+','-'],Ch);
- if Direction='D' then
- begin
- Yhold:=Ynow+4;
- if Ch='+' then
- begin
- X1:=Xnow-5; X3:=X1; X5:=X1+2; X2:=Xnow+5; X4:=X2; X6:=X2-2;
- Y1:=Ynow; Y3:=Y1+1; Y5:=Y1+3; Y2:=Y1; Y4:=Y3; Y6:=Y5;
- end
- else if Ch='-' then
- begin
- X1:=Xnow-3; X3:=Xnow-5; X5:=X3; X2:=Xnow+3; X4:=Xnow+5; X6:=X4;
- Y1:=Ynow; Y3:=Y1+2; Y5:=Y1+3; Y2:=Y1; Y4:=Y3; Y6:=Y5;
- end;
- end
- else if Direction='U' then
- begin
- Yhold:=Ynow-4;
- if Ch='+' then
- begin
- X1:=Xnow-5; X3:=X1; X5:=X1+2; X2:=Xnow+5; X4:=X2; X6:=X2-2;
- Y1:=Ynow-2; Y3:=Y1-1; Y5:=Ynow; Y2:=Y1; Y4:=Y3; Y6:=Y5;
- end
- else if Ch='-' then
- begin
- X1:=Xnow-3; X3:=Xnow-5; X5:=X3; X2:=Xnow+3; X4:=Xnow+5; X6:=X4;
- Y1:=Ynow-3; Y3:=Ynow-1; Y5:=Ynow; Y2:=Y1; Y4:=Y3; Y6:=Y5;
- end;
- end;
- end;
- if (Direction='R') or (Direction='L') then
- begin
- CHOOSE(23,' +Right -Right ',['+','-'],Ch);
- if Direction='R' then
- begin
- Xhold:=Xnow+4;
- if Ch='+' then
- begin
- X1:=Xnow; X3:=Xnow+2; X5:=Xnow+3; X2:=X1; X4:=X3; X6:=X5;
- Y1:=Ynow-2; Y3:=Ynow-4; Y5:=Y3; Y2:=Ynow+2; Y4:=Ynow+4; Y6:=Y4;
- end
- else if Ch='-' then
- begin
- X1:=Xnow; X3:=Xnow+1; X5:=Xnow+3; X2:=X1; X4:=X3; X6:=X5;
- Y1:=Ynow-4; Y3:=Y1; Y5:=Ynow-2; Y2:=Ynow+4; Y4:=Y2; Y6:=Ynow+2;
- end;
- end
- else if Direction='L' then
- begin
- Xhold:=Xnow-4;
- if Ch='+' then
- begin
- X1:=Xnow; X3:=Xnow-1; X5:=Xnow-3; X2:=X1; X4:=X3; X6:=X5;
- Y1:=Ynow-4; Y3:=Y1; Y5:=Ynow-2; Y2:=Ynow+4; Y4:=Y2; Y6:=Ynow+2;
- end
- else if Ch='-' then
- begin
- X1:=Xnow-3; X3:=Xnow-2; X5:=Xnow; X2:=X1; X4:=X3; X6:=X5;
- Y1:=Ynow-4; Y3:=Y1; Y5:=Ynow-2; Y2:=Ynow+4; Y4:=Y2; Y6:=Ynow+2;
- end;
- end;
- end;
- DDA(X1,Y1,X2,Y2,Color,0); DDA(X3,Y3,X4,Y4,Color,0); DDA(X5,Y5,X6,Y6,Color,0);
- MOVE_ABS(X1,Y1); LINE_ABS(X2,Y2);
- MOVE_ABS(X3,Y3); LINE_ABS(X4,Y4);
- MOVE_ABS(X5,Y5); LINE_ABS(X6,Y6);
- Xnow:=Xhold; Ynow:=Yhold; Xwas:=Xnow; Ywas:=Ynow;
- MOVE_ABS(Xnow,Ynow); PLOT(Xnow,Ynow,2);
- END; { BATTERY }
-
- procedure SOURCES;
- var Xhold,Yhold: integer;
- procedure POLARITY;
- var Xhold,Yhold: integer;
- BEGIN
- Xhold:=Xnow; Yhold:=Ynow;
- if (Direction='D') or (Direction='U') then
- begin
- CHOOSE(23,' +Up -Up ^Up |Up ',['+','-','^','|'],Ch);
- if Direction='D' then
- begin
- if Ch='+' then begin PLUS(Xhold,Yhold+5,Color,0); MINUS(Xhold,Yhold+13,Color,0); end;
- if Ch='-' then begin MINUS(Xhold,Yhold+5,Color,0); PLUS(Xhold,Yhold+13,Color,0); end;
- if Ch='^' then
- begin DDA(Xhold,Yhold+14,Xhold,Yhold+3,Color,0);
- DDA(Xhold,Yhold+3,Xhold+4,Yhold+7,Color,0);
- DDA(Xhold,Yhold+3,Xhold-4,Yhold+7,Color,0);
- MOVE_ABS(Xhold,Yhold+14); LINE_ABS(Xhold,Yhold+3);
- MOVE_ABS(Xhold,Yhold+3); LINE_ABS(Xhold+4,Yhold+7);
- MOVE_ABS(Xhold,Yhold+3); LINE_ABS(Xhold-4,Yhold+7);
- end;
- if Ch='|' then
- begin DDA(Xhold,Yhold+14,Xhold,Yhold+3,Color,0);
- DDA(Xhold,Yhold+14,Xhold+4,Yhold+10,Color,0);
- DDA(Xhold,Yhold+14,Xhold-4,Yhold+10,Color,0);
- MOVE_ABS(Xhold,Yhold+14); LINE_ABS(Xhold,Yhold+3);
- MOVE_ABS(Xhold,Yhold+14); LINE_ABS(Xhold+4,Yhold+10);
- MOVE_ABS(Xhold,Yhold+14); LINE_ABS(Xhold-4,Yhold+10);
- end;
- end
- else if Direction='U' then
- begin
- if Ch='+' then begin MINUS(Xhold,Yhold-5,Color,0); PLUS(Xhold,Yhold-13,Color,0); end;
- if Ch='-' then begin PLUS(Xhold,Yhold-5,Color,0); MINUS(Xhold,Yhold-13,Color,0); end;
- if Ch='^' then
- begin DDA(Xhold,Yhold-14,Xhold,Yhold-3,Color,0);
- DDA(Xhold,Yhold-14,Xhold+4,Yhold-10,Color,0);
- DDA(Xhold,Yhold-14,Xhold-4,Yhold-10,Color,0);
- MOVE_ABS(Xhold,Yhold-14); LINE_ABS(Xhold,Yhold-3);
- MOVE_ABS(Xhold,Yhold-14); LINE_ABS(Xhold+4,Yhold-10);
- MOVE_ABS(Xhold,Yhold-14); LINE_ABS(Xhold-4,Yhold-10);
- end;
- if Ch='|' then
- begin DDA(Xhold,Yhold-14,Xhold,Yhold-4,Color,0);
- DDA(Xhold,Yhold-4,Xhold+4,Yhold-8,Color,0);
- DDA(Xhold,Yhold-4,Xhold-4,Yhold-8,Color,0);
- MOVE_ABS(Xhold,Yhold-14); LINE_ABS(Xhold,Yhold-4);
- MOVE_ABS(Xhold,Yhold-4); LINE_ABS(Xhold+4,Yhold-8);
- MOVE_ABS(Xhold,Yhold-4); LINE_ABS(Xhold-4,Yhold-8);
- end;
- end;
- end;
- if (Direction='R') or (Direction='L') then
- begin
- CHOOSE(23,' +Right -Right >Right <Left ',['+','-','>','<'],Ch);
- if Direction='R' then
- begin
- if Ch='+' then begin PLUS(Xhold+13,Yhold,Color,0); MINUS(Xhold+5,Yhold,Color,0); end;
- if Ch='-' then begin MINUS(Xhold+13,Yhold,Color,0); PLUS(Xhold+5,Yhold,Color,0); end;
- if Ch='>' then
- begin DDA(Xhold+3,Yhold,Xhold+15,Yhold,Color,0);
- DDA(Xhold+15,Yhold,Xhold+11,Yhold+4,Color,0);
- DDA(Xhold+15,Yhold,Xhold+11,Yhold-4,Color,0);
- MOVE_ABS(Xhold+3,Yhold); LINE_ABS(Xhold+15,Yhold);
- MOVE_ABS(Xhold+15,Yhold); LINE_ABS(Xhold+11,Yhold+4);
- MOVE_ABS(Xhold+15,Yhold); LINE_ABS(Xhold+11,Yhold-4);
- end;
- if Ch='<' then
- begin DDA(Xhold+3,Yhold,Xhold+16,Yhold,Color,0);
- DDA(Xhold+3,Yhold,Xhold+7,Yhold+4,Color,0);
- DDA(Xhold+3,Yhold,Xhold+7,Yhold-4,Color,0);
- MOVE_ABS(Xhold+3,Yhold); LINE_ABS(Xhold+16,Yhold);
- MOVE_ABS(Xhold+3,Yhold); LINE_ABS(Xhold+7,Yhold+4);
- MOVE_ABS(Xhold+3,Yhold); LINE_ABS(Xhold+7,Yhold-4);
- end;
- end
- else if Direction='L' then
- begin
- if Ch='+' then begin MINUS(Xhold-13,Yhold,Color,0); PLUS(Xhold-5,Yhold,Color,0); end;
- if Ch='-' then begin PLUS(Xhold-13,Yhold,Color,0); MINUS(Xhold-5,Yhold,Color,0); end;
- if Ch='>' then
- begin DDA(Xhold-3,Yhold,Xhold-16,Yhold,Color,0);
- DDA(Xhold-3,Yhold,Xhold-7,Yhold+4,Color,0);
- DDA(Xhold-3,Yhold,Xhold-7,Yhold-4,Color,0);
- MOVE_ABS(Xhold-3,Yhold); LINE_ABS(Xhold-16,Yhold);
- MOVE_ABS(Xhold-3,Yhold); LINE_ABS(Xhold-7,Yhold+4);
- MOVE_ABS(Xhold-3,Yhold); LINE_ABS(Xhold-7,Yhold-4);
- end;
- if Ch='<' then
- begin DDA(Xhold-3,Yhold,Xhold-15,Yhold,Color,0);
- DDA(Xhold-15,Yhold,Xhold-11,Yhold+4,Color,0);
- DDA(Xhold-15,Yhold,Xhold-11,Yhold-4,Color,0);
- MOVE_ABS(Xhold-3,Yhold); LINE_ABS(Xhold-15,Yhold);
- MOVE_ABS(Xhold-15,Yhold); LINE_ABS(Xhold-11,Yhold+4);
- MOVE_ABS(Xhold-15,Yhold); LINE_ABS(Xhold-11,Yhold-4);
- end;
- end;
- end;
- END; { POLARITY }
-
- BEGIN { SOURCES }
- begin
- (*
- CHOOSE(23,' Independent Controlled ',['I','C'],Ch);
- *)
- Mode:=0; Xhold:=Xnow; Yhold:=Ynow;
- if Direction='D' then Ywas:=Ynow+9 else if Direction='U' then Ywas:=Ynow-9
- else if Direction='R' then Xwas:=Xnow+9 else Xwas:=Xnow-9; end;
- ARCDDA (Xwas, Ywas, 360, Xnow, Ynow, Color, Mode);
- PUT_POINT(3,Xnow,Ynow,360,Xwas,Ywas,Color,Mode); Xnow:=Xhold; Ynow:=Yhold;
- POLARITY;
- Xnow:=Xhold; Ynow:=Yhold;
- if Direction='D' then Ynow:=Ynow+19 else if Direction='U' then Ynow:=Ynow-19
- else if Direction='R' then Xnow:=Xnow+19 else Xnow:=Xnow-19;
- Color:=2; Xwas:=Xnow; Ywas:=Ynow;
- plot(Xnow,Ynow,Color); MOVE_ABS(Xnow,Ynow);
- END; { SOURCES }
-
- procedure RESISTORS;
- var X1,Y1,X2,Y2,Xhold,Yhold: integer;
- BEGIN
- Xhold:=Xnow; Yhold:=Ynow;
- if Direction='D' then begin X1:=Xnow-5; Y1:=Ynow+5; X2:=Xnow+6; Y2:=Ynow+10; Yhold:=Yhold+16; end
- else if Direction='U' then begin X1:=Xnow+5; Y1:=Ynow-5; X2:=Xnow-6; Y2:=Ynow-10; Yhold:=Yhold-16; end
- else if Direction='R' then begin X1:=Xnow+5; Y1:=Ynow-5; X2:=Xnow+10; Y2:=Ynow+6; Xhold:=Xhold+16; end
- else if Direction='L' then begin X1:=Xnow-5; Y1:=Ynow+5; X2:=Xnow-10; Y2:=Ynow-6; Xhold:=Xhold-16; end;
- DDA(Xwas,Ywas,X1,Y1,Color,0); DDA(X1,Y1,X2,Y2,Color,0); DDA(X2,Y2,Xhold,Yhold,Color,0);
- LINE_ABS(X1,Y1); LINE_ABS(X2,Y2); LINE_ABS(Xhold,Yhold);
- Xnow:=Xhold; Ynow:=Yhold; Xwas:=Xnow; Ywas:=Ynow;
- MOVE_ABS(Xnow,Ynow); PLOT(Xnow,Ynow,2);
- END; { RESISTORS }
-
- procedure CAPACITORS;
- var X1,Y1,X2,Y2,Xhold,Yhold: integer;
- BEGIN
- Xhold:=Xnow; Yhold:=Ynow;
- if (Direction='D') or (Direction='U') then
- begin
- X1:=Xhold-5; X2:=Xhold+5;
- if Direction='D' then
- begin
- DDA(X1,Yhold,X2,Yhold,Color,0); DDA(X1,Yhold+1,X2,Yhold+1,Color,0);
- MOVE_ABS(X1,Yhold); LINE_ABS(X2,Yhold); MOVE_ABS(X1,Yhold+1); LINE_ABS(X2,Yhold+1);
- DDA(X1,Yhold+3,X2,Yhold+3,Color,0); DDA(X1,Yhold+4,X2,Yhold+4,Color,0);
- MOVE_ABS(X1,Yhold+3); LINE_ABS(X2,Yhold+3); MOVE_ABS(X1,Yhold+4); LINE_ABS(X2,Yhold+4);
- Ynow:=Yhold+5; Ywas:=Ynow; Xnow:=Xhold; Xwas:=Xnow;
- MOVE_ABS(Xnow,Ynow);
- end
- else
- begin
- DDA(X1,Yhold,X2,Yhold,Color,0); DDA(X1,Yhold-1,X2,Yhold-1,Color,0);
- MOVE_ABS(X1,Yhold); LINE_ABS(X2,Yhold); MOVE_ABS(X1,Yhold-1); LINE_ABS(X2,Yhold-1);
- DDA(X1,Yhold-3,X2,Yhold-3,Color,0); DDA(X1,Yhold-4,X2,Yhold-4,Color,0);
- MOVE_ABS(X1,Yhold-3); LINE_ABS(X2,Yhold-3); MOVE_ABS(X1,Yhold-4); LINE_ABS(X2,Yhold-4);
- Xnow:=Xhold; Xwas:=Xnow; Ynow:=Yhold-5; Ywas:=Ynow;
- end;
- end
- else if (Direction='R') or (Direction='L') then
- begin
- Y1:=Ynow-5; Y2:=Ynow+5;
- if Direction='R' then
- begin
- DDA(Xhold,Y1,Xhold,Y2,Color,0); DDA(Xhold+1,Y1,Xhold+1,Y2,Color,0);
- MOVE_ABS(Xhold,Y1); LINE_ABS(Xhold,Y2); MOVE_ABS(Xhold+1,Y1); LINE_ABS(Xhold+1,Y2);
- DDA(Xhold+3,Y1,Xhold+3,Y2,Color,0); DDA(Xhold+4,Y1,Xhold+4,Y2,Color,0);
- MOVE_ABS(Xhold+3,Y1); LINE_ABS(Xhold+3,Y2); MOVE_ABS(Xhold+4,Y1); LINE_ABS(Xhold+4,Y2);
- Xnow:=Xhold+5; Xwas:=Xnow; Ynow:=Yhold; Ywas:=Ynow;
- end
- else
- begin
- DDA(Xhold,Y1,Xhold,Y2,Color,0); DDA(Xhold-1,Y1,Xhold-1,Y2,Color,0);
- MOVE_ABS(Xhold,Y1); LINE_ABS(Xhold,Y2); MOVE_ABS(Xhold-1,Y1); LINE_ABS(Xhold-1,Y2);
- DDA(Xhold-3,Y1,Xhold-3,Y2,Color,0); DDA(Xhold-4,Y1,Xhold-4,Y2,Color,0);
- MOVE_ABS(Xhold-3,Y1); LINE_ABS(Xhold-3,Y2); MOVE_ABS(Xhold-4,Y1); LINE_ABS(Xhold-4,Y2);
- Xnow:=Xhold-5; Xwas:=Xnow; Ynow:=Yhold; Ywas:=Ynow;
- end;
- end;
- MOVE_ABS(Xnow,Ynow); plot(Xnow,Ynow,2);
- END; { CAPACITORS }
-
- procedure INDUCTORS;
- var cX,cY,Step: integer;
- BEGIN
- Color:=0; Mode:=0; Step:=5;
- if (Direction='D') or (Direction='U') then
- begin
- if Direction='D' then
- begin
- cX:=Xnow; cY:=Ynow+Step;
- ARCDDA(cX,cY,240,Xnow,Ynow,Color,0);
- ARCDDA(cX,cY+Step-1,230,Xnow-Step+1,Ynow+Step+1,Color,0);
- PUT_POINT(3,Xnow,Ynow,240,cX,cY,Color,Mode);
- PUT_POINT(3,Xnow-Step+1,Ynow+Step+1,230,cX,cY+Step-1,Color,Mode);
- Ynow:=Ynow+14; Ywas:=Ynow;
- end
- else
- begin
- cX:=Xnow; cY:=Ynow-Step;
- ARCDDA(cX,cY,240,Xnow,Ynow,Color,0);
- ARCDDA(cX,cY-Step+1,230,Xnow+Step-1,Ynow-Step-1,Color,0);
- PUT_POINT(3,Xnow,Ynow,240,cX,cY,Color,Mode);
- PUT_POINT(3,Xnow+Step-1,Ynow-Step-1,230,cX,cY-Step+1,Color,Mode);
- Ynow:=Ynow-14; Ywas:=Ynow;
- end;
- end
- else if (Direction='R') or (Direction='L') then
- begin
- if Direction='R' then
- begin
- cX:=Xnow+Step; cY:=Ynow;
- ARCDDA(cX,cY,240,Xnow,Ynow,Color,0);
- ARCDDA(cX+Step-1,cY,230,Xnow+Step+1,Ynow+Step-1,Color,0);
- PUT_POINT(3,Xnow,Ynow,240,cX,cY,Color,Mode);
- PUT_POINT(3,Xnow+Step+1,Ynow+Step-1,230,cX+Step-1,cY,Color,Mode);
- Xnow:=Xnow+14; Xwas:=Xnow;
- end
- else
- begin
- cX:=Xnow-Step; cY:=Ynow;
- ARCDDA(cX,cY,240,Xnow,Ynow,Color,0);
- ARCDDA(cX-Step+1,cY,230,Xnow-Step-1,Ynow-Step+1,Color,0);
- PUT_POINT(3,Xnow,Ynow,240,cX,cY,Color,Mode);
- PUT_POINT(3,Xnow-Step-1,Ynow-Step+1,230,cX-Step+1,cY,Color,Mode);
- Xnow:=Xnow-14; Xwas:=Xnow;
- end;
- end;
- MOVE_ABS(Xnow,Ynow); plot(Xnow,Ynow,2);
- END; { INDUCTORS }
-
- BEGIN { DO_DRAW }
- INITIALIZE_DRAW;
- repeat
- Inkey := GET_KEY(FuncFlag);
- If FuncFlag then begin
- plot(Xnow,Ynow,1); Color:=0; C:=0;
- case Upcase(Inkey) of
- 'H': begin if Ynow > 0 then Ynow:=Ynow-1 else BEEP;
- plot(Xnow,Ynow,2); end;
- 'P': begin if Ynow < 171 then Ynow:=Ynow+1 else BEEP;
- plot(Xnow,Ynow,2); end;
- 'M': begin if Xnow < 231 then Xnow:=Xnow+1 else BEEP;
- plot(Xnow,Ynow,2); end;
- 'K': begin if Xnow > 0 then Xnow:=Xnow-1 else BEEP;
- plot(Xnow,Ynow,2); end;
- 'G': begin Xnow:=115; Ynow:=85; plot(Xnow,Ynow,2); end;
- end;
- end
- else
- case upcase(InKey) of
- 'M': MOVE_ABS(Xnow,Ynow);
- 'L': begin DDA(Xwas,Ywas,Xnow,Ynow,Color,0);
- if Ynow>Ywas then Direction:='D' else if Ynow<Ywas then Direction:='U'
- else if Xnow>Xwas then Direction:='R' else if Xnow<Xwas then Direction:='L';
- LINE_ABS(Xnow,Ynow);
- Xwas:=Xnow; Ywas:=Ynow;
- end;
- 'X': begin
- Color:=1; DDA(Xwas,Ywas,Xnow,Ynow,Color,0);
- Xwas:=Xnow; Ywas:=Ynow; Color:=0;
- end;
- 'T': ALPHANUMERIC;
- 'B': BATTERY;
- 'S': SOURCES;
- 'R': RESISTORS;
- 'C': CAPACITORS;
- 'I': INDUCTORS;
- 'P': PUT_DISK;
- 'G': GET_DISK;
- 'U': begin
- textmode; clrscr; graphics; palette(2);
- MAKE_PICTURE_CURRENT(44,14); palette(3);
- Ch:=TERMINATE;
- if Ch<>'Q' then INITIALIZE_DRAW
- else begin CLEARSCREEN; TEXTMODE; halt; end;
- MAKE_PICTURE_CURRENT(0,0);
- plot(Xnow,Ynow,2);
- end;
- 'E': begin CLEARSCREEN; ERASE; INITIALIZE_DRAW; end;
- end; { case }
- until UpCase(Inkey) in ['Q',#27];
- end; { AWAIT_STROKE }
-
- BEGIN { DO_DRAW }
- AWAIT_STROKE;
- END; { DO_DRAW }
-
- {mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}
- BEGIN
- INITIALIZE;
- repeat
- DO_DRAW;
- Ch:=TERMINATE;
- until Ch<>'C';
- CLEARSCREEN;
- TEXTMODE;
- END.